﻿#ifndef HTTP_SERVER_H
#define HTTP_SERVER_H

// 跨平台网络API支持 - WinSock2.h 必须在其他Windows头文件之前包含
#ifdef _WIN32
    #include <WinSock2.h>
    #include <windows.h>
    #define SOCKET_T SOCKET
#else
    #define SOCKET_T int
#endif

#include <string>
#include <map>
#include "db_manager.h"
#include "user_manager.h"
#include "search_engine.h"
#include "ai_integration.h"

class HttpServer {
public:
    HttpServer(int port = 8080);
    ~HttpServer();

    // 启动服务器
    bool start();
    
    // 停止服务器
    void stop();
    
    // 设置各个管理器
    void setDatabaseManager(DBManager* db_manager);
    void setUserManager(UserManager* user_manager);
    void setSearchEngine(SearchEngine* search_engine);
    void setAIIntegration(AIIntegration* ai_integration);

private:
    int port_;
    bool running_;
    DBManager* db_manager_;
    UserManager* user_manager_;
    SearchEngine* search_engine_;
    AIIntegration* ai_integration_;
    std::map<std::string, int> sessions_; // 会话ID到用户ID的映射
    
    // 处理各种HTTP请求的函数
    std::string handleRequest(const std::string& method, const std::string& path,
                            const std::map<std::string, std::string>& headers,
                            const std::string& body);
    
    // API路由处理
    std::string handleUserRegister(const std::string& body);
    std::string handleUserLogin(const std::string& body);
    std::string handleGetUserInfo(const std::string& user_id);
    std::string handleGetUserBalance(const std::string& user_id);
    std::string handleSearch(const std::string& query);
    std::string handleSetKeywordWeight(const std::string& body);
    std::string handleAIQuery(const std::string& body);
    std::string handleGetKeywordList(const std::string& user_id);
    
    // 静态文件处理
    std::string serveStaticFile(const std::string& path);
    
    // 工具函数
    std::string createResponse(int status_code, const std::string& content_type, const std::string& content);
    std::string parseCookie(const std::string& cookie_str, const std::string& name);
    std::string createSession(int user_id);
    int validateSession(const std::string& session_id);
    void cleanupExpiredSessions();
    
    // JSON解析和生成
    std::map<std::string, std::string> parseJson(const std::string& json_str);
    std::string generateJson(const std::map<std::string, std::string>& data);
};

#endif // HTTP_SERVER_H